/* Microsoft Reference Implementation for TPM 2.0
 *
 *  The copyright in this software is being made available under the BSD License,
 *  included below. This software may be subject to other third party and
 *  contributor rights, including patent rights, and no such rights are granted
 *  under this license.
 *
 *  Copyright (c) Microsoft Corporation
 *
 *  All rights reserved.
 *
 *  BSD License
 *
 *  Redistribution and use in source and binary forms, with or without modification,
 *  are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice, this list
 *  of conditions and the following disclaimer.
 *
 *  Redistributions in binary form must reproduce the above copyright notice, this
 *  list of conditions and the following disclaimer in the documentation and/or
 *  other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 *  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/*(Auto-generated)
 *  Created by TpmStructures; Version 4.4 Mar 26, 2019
 *  Date: Mar 28, 2019  Time: 08:25:17PM
 */

#if CC_PolicySigned // Command must be enabled

#ifndef _Policy_Signed_FP_H_
#define _Policy_Signed_FP_H_

// Input structure definition
typedef struct {
    /*
    handle for a key that will validate the signature
    Auth Index: None
    用来验证签名的密钥句柄
    */
    TPMI_DH_OBJECT              authObject;
    /*
    handle for the policy session being extended
    Auth Index: None
    待修改(hash extended)的策略会话。
    */
    TPMI_SH_POLICY              policySession;
    /*
    the policy nonce for the session
    This can be the Empty Buffer.
    策略会话建立时，TPM 返回的 nonce 值。
    */
    TPM2B_NONCE                 nonceTPM;
    /*
    digest of the command parameters to which this
    authorization is limited
    This is not the cpHash for this command but the cpHash
    for the command to which this policy session will be
    applied. If it is not limited, the parameter will be the
    Empty Buffer.
    TODO: 什么是 该策略会话要应用的命令？
    */
    TPM2B_DIGEST                cpHashA;
    /*
    a reference to a policy relating to the authorization –
    may be the Empty Buffer
    Size is limited to be no larger than the nonce size
    supported on the TPM
    认证实体额外提供的数据，长度最大为 nonce
    */
    TPM2B_NONCE                 policyRef;
    /*
    time when authorization will expire, measured in
    seconds from the time that nonceTPM was generated
    If expiration is non-negative, a NULL Ticket is returned.
    See 23.2.5
    */
    INT32                       expiration;
    TPMT_SIGNATURE              auth;
} PolicySigned_In;

// Output structure definition
typedef struct {
    /*
    implementation-specific time value, used to indicate to the TPM when the ticket expires
    NOTE If policyTicket is a NULL Ticket, then this shall be the Empty Buffer
    特定于实现的时间值，用于在票证到期时向 TPM 指示
    注意 如果 policyTicket 是 NULL Ticket，那么这应该是空缓冲区
    */
    TPM2B_TIMEOUT               timeout;
    TPMT_TK_AUTH                policyTicket;
} PolicySigned_Out;

// Response code modifiers
#define RC_PolicySigned_authObject  (TPM_RC_H + TPM_RC_1)
#define RC_PolicySigned_policySession   (TPM_RC_H + TPM_RC_2)
#define RC_PolicySigned_nonceTPM    (TPM_RC_P + TPM_RC_1)
#define RC_PolicySigned_cpHashA (TPM_RC_P + TPM_RC_2)
#define RC_PolicySigned_policyRef   (TPM_RC_P + TPM_RC_3)
#define RC_PolicySigned_expiration  (TPM_RC_P + TPM_RC_4)
#define RC_PolicySigned_auth    (TPM_RC_P + TPM_RC_5)

// Function prototype
TPM_RC
TPM2_PolicySigned(
    PolicySigned_In             *in,
    PolicySigned_Out            *out
);

#endif  // _Policy_Signed_FP_H_
#endif  // CC_PolicySigned
